package com.me.study.javaCore.classLoader.classLoadingSeq1.test2;

import com.me.study.javaCore.classLoader.classLoadingSeq1.test1.ClassA;
import com.me.study.javaCore.classLoader.classLoadingSeq1.test1.Person;

/**
 * 类加载顺序测试：子类
 *
 * @author ME
 * @date   2019/4/27
 */
public class ClassB extends ClassA {

    static{
        System.out.println("[ClassB] static");
    }

    public ClassB() {
        System.out.println("[ClassB] constructor");
    }

    Person personB = new Person("ClassB");
    {
        // 成员变量 和 代码块 顺序执行，且早于构造方法
        System.out.println("sbbbbb");
    }

    public static void main(String[] args) {
        /**
         * [ClassA] static ->
         * [person] static ->
         * [person] static ClassA ->
         * [ClassB] static ->
         * [ClassA] constructor ->
         * [person] ClassB ->
         * [ClassB] constructor
         */
        /**
         * 先静态域后动态域。
         * 同（静态、动态）域代码，先父类后子类。
         * 同（父、子）类代码当中，
         *      静态域按顺序执行（ClassA 中 静态personA 晚于 静态块，引用 personA 编译不通过）；
         *      动态域当中 成员变量（代码块）优先于构造方法（ClassB 中，构造方法声明在 personB 前，却先调用了 personB），其余按顺序。
         *
         */
        ClassB my = new ClassB();
    }
}
